//代码分析
static const int CompWin = 2;
static const int Draw = 1;
static const int HumanWin = 0;
void TicTacToe::compPlace() {
    int bestMove = getBestMove();
    board.placeComp(bestMove);
    cout << "the computer choice is: " << endl;
}
int TicTacToe::getBestMove() {
    int bestMove = 0, value = 0;
    findCompMove(bestMove,value,HumanWin, CompWin);//极大化过程
    return bestMove;
}
//模拟了ai和hum的对弈过程
void TicTacToe::findCompMove(int& bestMove,int &value, int alpha, int beta) {
	//index:0：落子位置，1：估值，2，左方，第一次为0，3，右方，第一次为2
	//极大化过程
    if (board.isFull())
        value = Draw;
	//满盘估值为1，并结束
    else if (board.immediateComWin(bestMove))
        value = CompWin;
	  //落子处将使ai赢，估值为2，bestMove不变，第一次为0，并结束
    else {
        value = alpha;
	    //第一次令估值为0
        for (int i = 0; i < GridNuber&&value < beta; i++) {
			//当估值小于beta，第一次为2，Comwin
			//即估值未能使ai获胜
			//循环选择落子位置i
            if (board.isEmpty(i)) {
				//当i处未落子
                board.placeComp(i);
				//ai落子
                int tmp = -1, response = -1;  // Tmp is useless
				//为hum方初始估值-1
                findHumanMove(tmp, response, value, beta);//极小化过程
				//显然提供的tmp并未起到作用
                board.unPlace(i);
				//起子
                if (response > value) {
					//若极小化估值比当前估值大，
                    value = response;
                    bestMove = i;
					//更新最佳落子位置，更新最佳估值为其产生的估值
					//第一次的bestmove即为ai在现实层的模拟位置，
					//之后为模拟过程的模拟位置
					//估值向着增大的方向进行
					//ai在i处的落子使得hum后续落子未威胁到ai，胜值提升
                }
				//估值高，接近ai胜方向的策略，将会被hum层舍弃
				//估值低，接近ai负方向的策略，将会被hum层保留，更新到hum的估值和估位
            }
        }
    }
}

void TicTacToe::findHumanMove(int& bestMove,int & value, int alpha, int beta) {
	//index：0：落子位置，第一次为-1，1：估值：第一次为-1，2:左方估值，第一次为0，即未估值或，或为hum胜值，3：右方，第一次为2
	//极小化过程
    if (board.isFull())
        value=Draw;
	//满盘，令估值为1，并结束
    else if (board.immediateHumanWin(bestMove)){
        value=HumanWin;
		//hum落子处将使hum获胜，令估值为0，并结束
    }
    else {
        value = beta; 
		//令估值为beta，第一次为2，即ai胜值
        for (int i = 0; i < GridNuber&&value>alpha; i++) {//估值低，非常接近hum胜方向的策略，将会被ai舍弃
			//第一次value=2，alpha为0，即假定估值靠近ai方向，进行最小化过程，循环执行
			//当估值小于ai胜值，即不能使hum胜
			//选择落子位置为i
            if (board.isEmpty(i)) {
				//当落子处为空
                board.placeHuman(i);
                //hum落子
				int tmp = -1, response = -1;  // Tmp is useless
                //为ai方初始落子位置和估值
				//alpha为0，beta为2，未改变
				//显然tmp未有任何作为
				findCompMove(tmp, response, alpha, value);
				//极大化估值过程
                board.unPlace(i);
				//起子
                if (response <value) {
					//当模拟估值大化失败，即ai无法令胜值超过hum
					//当ai估值比hum小，即hum胜率可提升
                    value = response;
					//更新估值
                    bestMove = i;
					//hum最佳落子位置更新
					//ai落子威胁到hum，则令估值减小，加快当前循环结束
					//估值会向着减小的方向进行，即向着hum胜的方向
                }
            }
        }
    }
}
//